home *** CD-ROM | disk | FTP | other *** search
/ NeXT Education Software Sampler 1992 Fall / NeXT Education Software Sampler 1992 Fall.iso / Programming / Source / WAIS / next-ui / Doc.m < prev    next >
Encoding:
Text File  |  1992-02-03  |  3.6 KB  |  182 lines

  1. // Doc.m
  2. //
  3. // Free software created 1 Feb 1992
  4. // by Paul Burchard <burchard@math.utah.edu>.
  5.  
  6. #import "Doc.h"
  7. #import "DocControl.h"
  8. #import <objc/HashTable.h>
  9. #import <appkit/appkit.h>
  10. #import <stdlib.h>
  11. #import <string.h>
  12.  
  13.  
  14. @implementation Doc
  15.  
  16. static id convertFileNameToDoc;
  17.  
  18. + (const char *)fileType
  19. {
  20.     return "";
  21. }
  22.  
  23. + (const char *)nibName
  24. {
  25.     return "Doc.nib";
  26. }
  27.  
  28. + (const char *)miniIconName
  29. {
  30.     return NULL;
  31. }
  32.  
  33. + (BOOL)backupOnSave
  34. {
  35.     return NO;
  36. }
  37.  
  38. + (const char *)defaultFolder
  39. {
  40.     return NXHomeDirectory();
  41. }
  42.  
  43. + initialize
  44. {
  45.     if(self != [Doc class]) return self;
  46.     convertFileNameToDoc = [[HashTable alloc] initKeyDesc:"%" valueDesc:"@"];
  47.     return self;
  48. }
  49.  
  50. - init
  51. {
  52.     static count = 0;
  53.     NXRect theFrame;
  54.     NXSize theScreen;
  55.     NXScreen *ignore;
  56.     const char *iname;
  57.     
  58.     [super init];
  59.     [NXApp loadNibSection:[[self class] nibName] owner:self];
  60.     
  61.     // Displace successive new windows down and right until edge of screen.
  62.     [window getFrame:&theFrame andScreen:&ignore];
  63.     [NXApp getScreenSize:&theScreen];
  64.     if((NX_MAXX(&theFrame) + 20.0*count) > theScreen.width
  65.         || (NX_Y(&theFrame) - 25.0*count) < 0)
  66.     count = 0;
  67.     NX_X(&theFrame) += 20.0*count;
  68.     NX_Y(&theFrame) -= 25.0*count;
  69.     count++;
  70.     [window moveTo:NX_X(&theFrame) :NX_Y(&theFrame)];
  71.  
  72.     // Make window represent this Doc type.
  73.     [window setDelegate:self];
  74.     //!!![window setFreeWhenClosed:YES];
  75.     if(iname = [[self class] miniIconName]) [window setMiniwindowIcon:iname];
  76.     fileName = 0;
  77.     [window makeKeyAndOrderFront:nil];
  78.     return self;
  79. }
  80.  
  81. - free
  82. {
  83.     [window free];
  84.     if(fileName) [convertFileNameToDoc removeKey:fileName];
  85.     return [super free];
  86. }
  87.  
  88. - setFileName:(const char *)aName
  89. {
  90.     const char *aType;
  91.     
  92. //!!!
  93. if(!aName && fileName) { [convertFileNameToDoc removeKey:fileName]; fileName = 0; }
  94.  
  95.     // Check if extension matches file type.
  96.     if(!aName) return nil;
  97.     if(!(aType = strrchr(aName, '/'))) aType = aName;
  98.     if(aType = strrchr(aType, '.'))
  99.         { if(strcmp(aType+1, [[self class] fileType]) != 0) return nil; }
  100.     else
  101.         { if(strcmp("", [[self class] fileType]) != 0) return nil; }
  102.  
  103.     // Re-index doc in filename table (don't overwrite existing Doc).
  104.     if([[self class] docForFileName:aName]) return nil;
  105.     if(fileName) [convertFileNameToDoc removeKey:fileName];
  106.     fileName = NXUniqueString(aName);//!!! wasteful but avoid HashTable woes
  107.     [convertFileNameToDoc insertKey:(void *)fileName value:(void *)self];
  108.  
  109.     // Re-title window.
  110.     [window setTitleAsFilename:fileName];
  111.     return self;
  112. }
  113.  
  114. - (const char *)fileName
  115. {
  116.     return fileName;
  117. }
  118.  
  119. + docForFileName:(const char *)aName
  120. {
  121.     return (id)[convertFileNameToDoc valueForKey:(void *)aName];
  122. }
  123.  
  124. - dump:sender
  125. {
  126.     // Implemented in subclass.
  127.     if(!fileName) return nil;
  128.     return self;
  129. }
  130.  
  131. - load:sender
  132. {
  133.     // Implemented in subclass.
  134.     if(!fileName) return nil;
  135.     return self;
  136. }
  137.  
  138. - textDidChange:sender
  139. {
  140.     [window setDocEdited:YES];
  141.     return self;
  142. }
  143.  
  144. - windowWillClose:sender
  145. {
  146.     // Check with delegate first.
  147.     if(delegate && [delegate respondsTo:@selector(windowWillClose:)]
  148.     && ![delegate windowWillClose:sender])
  149.         return nil;
  150.     
  151.     // Give user chance to save or rethink if edited, else free doc.
  152.     if(![[NXApp delegate] closeDoc:self andFree:NO]) return nil;//!!!
  153.     return sender;
  154. }
  155.  
  156. - window
  157. {
  158.     return window;
  159. }
  160.  
  161. - setDelegate:anObject
  162. {
  163.     delegate = anObject;
  164.     return self;
  165. }
  166.  
  167. - delegate
  168. {
  169.     return delegate;
  170. }
  171.  
  172. - forward:(SEL)aSelector :(marg_list)argFrame
  173. {
  174.     if([delegate respondsTo:aSelector])
  175.         return [delegate performv:aSelector :argFrame];
  176.     else return nil;
  177. }
  178.  
  179. @end
  180.  
  181.  
  182.